//
//  MvvmMusicListDemoTests.swift
//  MvvmMusicListDemoTests
//
//  Created by aron on 2018/12/13.
//  Copyright © 2018 aron. All rights reserved.
//

import XCTest
import RxSwift

@testable import MvvmMusicListDemo

class MvvmMusicListDemoTests: XCTestCase {

    override func setUp() {
        // Put setup code here. This method is called before the invocation of each test method in the class.
        print("======================setUp======================")
    }

    override func tearDown() {
        print("======================tearDown======================")
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    }

    func testBahaviorSubject() {
        print("======================testExample======================")
        // BehaviorSubject 需要通过一个默认初始值来创建。
        // 当一个订阅者来订阅它的时候，这个订阅者会立即收到 BehaviorSubjects 上一个发出的event。之后就跟正常的情况一样，它也会接收到 BehaviorSubject 之后发出的新的 event。
        let disposeBag = DisposeBag()
        
        // 创建BehaviorSubject对象，包含了一个初始值
        let subject = BehaviorSubject(value: "111")
        
        // 第一次订阅
        subject.subscribe { (event) in
            print("第一次订阅：\(event)")
            }.disposed(by: disposeBag)
        
        // 发送Next事件
        subject.onNext("222")
        
        // 发送Error事件
        subject.onError(NSError(domain: "local", code: 0, userInfo: nil))
        
        // 第二次订阅
        subject.subscribe { (event) in
            print("第二次订阅：\(event)")
            }.disposed(by: disposeBag)
    }

    
    func testVariable() {
        // Variable 其实就是对 BehaviorSubject 的封装，所以它也必须要通过一个默认的初始值进行创建。
        //
        // Variable 具有 BehaviorSubject 的功能，能够向它的订阅者发出上一个 event 以及之后新创建的 event。
        // 不同的是，Variable 还会把当前发出的值保存为自己的状态。同时它会在销毁时自动发送 .complete的 event，不需要也不能手动给 Variables 发送 completed或者 error 事件来结束它。
        // 简单地说就是 Variable 有一个 value 属性，我们改变这个 value 属性的值就相当于调用一般 Subjects 的 onNext() 方法，而这个最新的 onNext() 的值就被保存在 value 属性里了，直到我们再次修改它。
        
        let disposeBag = DisposeBag()
        
        // 使用一个初始值创建Variable
        let variable = Variable("111")
        
        // 修改value值
        variable.value = "222"
        
        // 使用asObservable方法返回一个Observable类型进行订阅
        variable.asObservable().subscribe { (event) in
            print("第一次订阅：\(event)")
            }.disposed(by: disposeBag)
        
        variable.value = "333"
        
        variable.asObservable().subscribe { (event) in
            print("第二次订阅：\(event)")
        }.disposed(by: disposeBag)
        
        variable.value = "444"
        
        // Output:
        // 第一次订阅：next(222)
        // 第一次订阅：next(333)
        // 第二次订阅：next(333)
        // 第一次订阅：next(444)
        // 第二次订阅：next(444)
        // 第一次订阅：completed
        // 第二次订阅：completed
    }
    
    func testObservable() {
//        let observable = Observable<Int>.just(5)
        let observable = Observable<String>.create { (observer) -> Disposable in
            observer.onNext("111")
            observer.onNext("222")
            observer.onCompleted()
            return Disposables.create()
        }
        let disposable = observable.subscribe { (event) in
            print("event = \(event)  element = \(event.element)")
        }
        
        disposable.dispose()
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measure {
            // Put the code you want to measure the time of here.
        }
    }

}
